#include "mysqldatabase.h"
#include <QSqlRecord>
#include <QSqlError>
#include <QDebug>

// 构造函数：初始化数据库连接
MySQLDatabase::MySQLDatabase(QObject *parent) : Database(parent)
{
    // 初始化MySQL驱动（指定连接名，避免冲突）
    m_db = QSqlDatabase::addDatabase("QMYSQL", "mysql_connection");
}

// 析构函数：确保断开连接
MySQLDatabase::~MySQLDatabase()
{
    disconnect();
}

// 连接数据库
bool MySQLDatabase::connect(const DatabaseConfig &config)
{
    // 如果已连接，先断开
    if (isConnected()) {
        disconnect();
    }

    // 设置基本连接参数（从配置对象获取）
    m_db.setHostName(config.host());
    m_db.setPort(config.port());
    m_db.setDatabaseName(config.databaseName());
    m_db.setUserName(config.userName());
    m_db.setPassword(config.password());
    
    // 设置连接选项以优化远程连接
    QString connectOptions;
    
    // 设置连接超时
    connectOptions += QString("MYSQL_OPT_CONNECT_TIMEOUT=%1;").arg(config.connectTimeout());
    
    // 设置读写超时
    connectOptions += QString("MYSQL_OPT_READ_TIMEOUT=%1;").arg(config.readTimeout());
    connectOptions += QString("MYSQL_OPT_WRITE_TIMEOUT=%1;").arg(config.writeTimeout());
    
    // 设置字符集
    connectOptions += QString("MYSQL_SET_CHARSET_NAME=%1;").arg(config.charset());
    
    // 设置自动重连
    if (config.autoReconnect()) {
        connectOptions += "MYSQL_OPT_RECONNECT=1;";
    }
    
    // 设置SSL选项
    if (config.useSSL()) {
        connectOptions += "MYSQL_OPT_SSL_MODE=SSL_MODE_REQUIRED;";
    } else {
        connectOptions += "MYSQL_OPT_SSL_MODE=SSL_MODE_DISABLED;";
    }
    
    // 应用连接选项
    if (!connectOptions.isEmpty()) {
        m_db.setConnectOptions(connectOptions);
        qDebug() << "MySQL连接选项：" << connectOptions;
    }

    // 尝试打开连接
    if (!m_db.open()) {
        m_lastError = m_db.lastError().text();
        qCritical() << "MySQL连接失败：" << m_lastError;
        qCritical() << "连接参数 - 主机：" << config.host() << "端口：" << config.port();
        qCritical() << "请检查：1.远程MySQL服务器是否运行 2.网络连接是否正常 3.防火墙设置 4.MySQL用户权限";
        return false;
    }

    qDebug() << "MySQL远程连接成功：" << config.host() << ":" << config.port() << "/" << config.databaseName();
    return true;
}

// 断开连接
void MySQLDatabase::disconnect()
{
    if (m_db.isOpen()) {
        m_db.close();
        qDebug() << "MySQL已断开连接";
    }
}

// 执行无返回结果的SQL
bool MySQLDatabase::execute(const QString &query, const QVector<QVariant> &params)
{
    if (!isConnected()) {
        m_lastError = "数据库未连接";
        return false;
    }

    QSqlQuery sqlQuery(m_db);  // 使用当前连接执行查询
    if (!sqlQuery.prepare(query)) {  // 预处理SQL（防止注入）
        m_lastError = sqlQuery.lastError().text();
        qWarning() << "SQL预处理失败：" << m_lastError;
        return false;
    }

    // 绑定参数（替换SQL中的?）
    for (const auto &param : params) {
        sqlQuery.addBindValue(param);
    }

    // 执行SQL
    if (!sqlQuery.exec()) {
        m_lastError = sqlQuery.lastError().text();
        qWarning() << "SQL执行失败：" << m_lastError << "，SQL：" << query;
        return false;
    }

    return true;
}

// 执行有返回结果的SQL
QVector<QMap<QString, QVariant>> MySQLDatabase::query(const QString &query, const QVector<QVariant> &params)
{
    QVector<QMap<QString, QVariant>> results;
    
    qDebug() << "数据库查询SQL:" << query;
    qDebug() << "查询参数:" << params;

    if (!isConnected()) {
        m_lastError = "数据库未连接";
        qDebug() << "数据库未连接!";
        return results;
    }

    QSqlQuery sqlQuery(m_db);
    if (!sqlQuery.prepare(query)) {
        m_lastError = sqlQuery.lastError().text();
        qWarning() << "SQL预处理失败：" << m_lastError;
        return results;
    }

    // 绑定参数
    for (const auto &param : params) {
        sqlQuery.addBindValue(param);
    }

    // 执行查询
    if (!sqlQuery.exec()) {
        m_lastError = sqlQuery.lastError().text();
        qWarning() << "查询失败：" << m_lastError << "，SQL：" << query;
        return results;
    }

    // 读取结果集（一行一行存储）
    while (sqlQuery.next()) {
        QMap<QString, QVariant> row;
        QSqlRecord record = sqlQuery.record();  // 获取当前行记录
        for (int i = 0; i < record.count(); ++i) {
            // 字段名作为键，字段值作为值
            row[record.fieldName(i)] = record.value(i);
        }
        results.append(row);
    }

    qDebug() << "数据库查询返回记录数:" << results.size();
    if (!results.isEmpty()) {
        qDebug() << "数据库第一条记录:" << results.first();
    }

    return results;
}

// 事务操作
bool MySQLDatabase::beginTransaction()
{
    return m_db.transaction();
}

bool MySQLDatabase::commitTransaction()
{
    return m_db.commit();
}

bool MySQLDatabase::rollbackTransaction()
{
    return m_db.rollback();
}

// 检查连接状态
bool MySQLDatabase::isConnected() const
{
    return m_db.isOpen();
}

// 获取最后错误信息
QString MySQLDatabase::lastError() const
{
    return m_lastError;
}
